package com.github.wicketoracle.app.data;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.Component;
import org.apache.wicket.Localizer;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.extensions.markup.html.tree.table.ColumnLocation;
import org.apache.wicket.extensions.markup.html.tree.table.IColumn;
import org.apache.wicket.extensions.markup.html.tree.table.IRenderable;
import org.apache.wicket.extensions.markup.html.tree.table.PropertyRenderableColumn;
import org.apache.wicket.extensions.markup.html.tree.table.PropertyTreeColumn;
import org.apache.wicket.extensions.markup.html.tree.table.TreeTable;
import org.apache.wicket.extensions.markup.html.tree.table.ColumnLocation.Alignment;
import org.apache.wicket.extensions.markup.html.tree.table.ColumnLocation.Unit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.wicketoracle.app.data.list.coded.CodedListMgrPage;
import com.github.wicketoracle.app.data.list.intersection.IntersectionListMgrPage;
import com.github.wicketoracle.app.data.list.standard.StandardListMgrPage;
import com.github.wicketoracle.app.data.list.subdivision.SubdivisionListMgrPage;
import com.github.wicketoracle.app.data.list.updateonly.UpdateOnlyListMgrPage;
import com.github.wicketoracle.app.exception.NothingToDoException;
import com.github.wicketoracle.html.page.StandardPage;
import com.github.wicketoracle.html.panel.CheckboxPanel;
import com.github.wicketoracle.html.panel.TreeControlPanel;
import com.github.wicketoracle.html.panel.menu.PostLoginMenuPanelFactory;
import com.github.wicketoracle.session.Session;
@AuthorizeInstantiation( RequiredRoles.ROLE_REF_DATA_MGR )
public final class DataMgrPage extends StandardPage
{
/** Log */
private static final Logger LOGGER = LoggerFactory.getLogger( DataMgrPage.class );
private final Panel menuPanel = PostLoginMenuPanelFactory.getPostLoginMenuPanel();
private final DataMgrForm dataMgrForm = new DataMgrForm( "FormDataTree" );
/**
*
*/
public DataMgrPage()
{
add( menuPanel );
add( dataMgrForm );
}
/**
*
* @author Andrew Hall
*
*/
private final class DataMgrForm extends StatelessForm<DataStructure>
{
private static final long serialVersionUID = 1L;
private boolean canConfigureData = ( ( Session ) getSession() ).getRoles().hasRole( RequiredRoles.ROLE_CONFIGURE_REF_DATA );
private final Button submitButton = new Button( "ButtonSubmit" );
private TreeTable dataMgrTreeTable = new TreeTable( "DataTree" , getTreeModel() , getColumns() )
{
private static final long serialVersionUID = 1L;
protected void onNodeLinkClicked( final AjaxRequestTarget pTarget , final TreeNode pNode )
{
final DataStructure dataStructure = ( ( DataStructure ) ( ( DefaultMutableTreeNode ) pNode ).getUserObject() );
final String dataStructureType = dataStructure.getRdtCode();
if ( dataStructure.getEditable() )
{
if ( dataStructureType.equals( "SPL" ) )
{
setResponsePage( new StandardListMgrPage( dataStructure ) );
}
else if ( dataStructureType.equals( "SDV" ) )
{
setResponsePage( new SubdivisionListMgrPage( dataStructure ) );
}
else if ( dataStructureType.equals( "CLT" ) )
{
setResponsePage( new CodedListMgrPage( dataStructure ) );
}
else if ( dataStructureType.equals( "ULT" ) )
{
setResponsePage( new UpdateOnlyListMgrPage( dataStructure ) );
}
else if ( dataStructureType.equals( "ILT" ) )
{
setResponsePage( new IntersectionListMgrPage( dataStructure ) );
}
}
}
};
private final TreeControlPanel treeControlPanel = new TreeControlPanel( "PanelTreeControl" , dataMgrTreeTable );
/**
*
* @param pId
*/
public DataMgrForm( final String pId )
{
super( pId );
add( submitButton );
dataMgrTreeTable.setRootLess( true );
dataMgrTreeTable.getTreeState().expandAll();
add( dataMgrTreeTable );
add( treeControlPanel );
submitButton.setVisible( canConfigureData );
}
/**
*
* @return
*/
private IColumn[] getColumns()
{
Localizer localizer = getLocalizer();
List<IColumn> treeTableColumns = new ArrayList<IColumn>();
treeTableColumns.add( new PropertyTreeColumn( new ColumnLocation( Alignment.MIDDLE , 18 , Unit.PROPORTIONAL ) , localizer.getString( "HeaderDataStructureName" , this ) , "userObject.refdataDescr" ) );
if ( getIsDebugInfoVisible() )
{
treeTableColumns.add
(
new PropertyRenderableColumn( new ColumnLocation( Alignment.MIDDLE , 8 , Unit.PROPORTIONAL ) , "Required DB Role", "userObject.dbrlCode" )
);
treeTableColumns.add
(
new PropertyRenderableColumn( new ColumnLocation( Alignment.MIDDLE , 8 , Unit.PROPORTIONAL ) , "Data Structure Type", "userObject.rdtCode" )
);
}
if ( canConfigureData )
{
treeTableColumns.add
(
new PropertyRenderableColumn( new ColumnLocation( Alignment.RIGHT , 8 , Unit.EM ) , localizer.getString( "HeaderMakeEditable" , this ) , "userObject.editable" )
{
private static final long serialVersionUID = 1L;
/**
* @see IColumn#newCell( MarkupContainer, String, TreeNode, int )
*/
@Override
public Component newCell( final MarkupContainer pParent , final String pId , final TreeNode pNode , final int pLevel )
{
return new CheckboxPanel( pId , new PropertyModel<Boolean>( pNode , getPropertyExpression() ) );
}
/**
* @see IColumn#newCell( TreeNode, int )
*/
public IRenderable newCell( final TreeNode pNode , final int pLevel )
{
return null;
}
}
);
}
return treeTableColumns.toArray( new IColumn [ 0 ] );
}
/**
*
* @return
*/
private TreeModel getTreeModel()
{
Session session = ( Session ) getSession();
DataMgrDAO dataService = null;
TreeModel treeModel = null;
try
{
dataService = new DataMgrDAO( session.getUsername() , session.getPassword() );
treeModel = dataService.getRefdataTree( new DefaultMutableTreeNode( getLocalizer().getString( "LabelRootTreeNode" , this ) ) );
}
catch ( SQLException sqle )
{
LOGGER.error
(
"SQL Exception when retrieving list of reference data structures -> {}; error code -> {}; sql state -> {}"
, new Object [ ]
{
sqle.getMessage()
, sqle.getErrorCode()
, sqle.getSQLState()
}
);
error( getLocalizer().getString( "MessageUnexpectedError" , this ) );
}
finally
{
if ( ! dataService.closeConnection() )
{
error( getLocalizer().getString( "MessageUnexpectedError" , this ) );
}
}
if ( treeModel == null )
{
treeModel = new DefaultTreeModel( new DefaultMutableTreeNode( getLocalizer().getString( "LabelRootTreeNodeError" , this ) ) );
}
return treeModel;
}
/**
*
*/
@Override
public void onSubmit()
{
Session session = ( Session ) getSession();
DataMgrDAO dataService = null;
try
{
dataService = new DataMgrDAO( session.getUsername() , session.getPassword() );
dataService.configRefdata( dataMgrTreeTable.getModelObject() );
dataService.doCommit();
dataMgrTreeTable.setModelObject( getTreeModel() );
info( getLocalizer().getString( "MessageSuccess" , this ) );
}
catch ( NothingToDoException ntde )
{
error( getLocalizer().getString( "NoWorkToDo" , this ) );
}
catch ( SQLException sqle )
{
LOGGER.error
(
"SQL Exception when configuring reference data structures -> {}; error code -> {}; sql state -> {}"
, new Object[]
{
sqle.getMessage()
, sqle.getErrorCode()
, sqle.getSQLState()
}
);
error( getLocalizer().getString( "MessageUnexpectedError" , this ) );
}
finally
{
if ( ! dataService.closeConnection() )
{
error( getLocalizer().getString( "MessageUnexpectedError" , this ) );
}
}
}
/**
*
*/
@Override
public void onBeforeRender()
{
final TreeModel treeModel = dataMgrTreeTable.getModelObject();
final boolean isData = ( treeModel.getChildCount( treeModel.getRoot() ) >= 1 );
if ( ! isData )
{
info( getLocalizer().getString( "MessageNoDataFound" , this ) );
setVisible( false );
}
super.onBeforeRender();
}
}
}